package vista;

import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JToggleButton;

import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;

import modelo.*;

import java.awt.GridLayout;
import java.awt.Color;
import java.util.Observable;
import java.util.Observer;

import javax.swing.ImageIcon;
import javax.swing.JProgressBar;
import javax.swing.SwingConstants;

import controlador.ControladorJuego;
import java.awt.Dimension;
import java.awt.Label;
import java.awt.Font;
import javax.swing.JLabel;

public class NavalgoPrincipal extends JFrame implements Observer {	
	private static final long serialVersionUID = 1L;
	private JPanel tableroPanel;
	private JButton[][] tableroBotones;
	private JPanel disparosPanel;
	private ModeloJuego modelo;
	private JProgressBar puntosBarra;
	private Label puntosLabel;	
	private ControladorJuego control;
	
		
	public NavalgoPrincipal(ModeloJuego modelo, final ControladorJuego control) {
		this.control = control;
		this.modelo = modelo;
		
		setMinimumSize(new Dimension(990, 590));
		setIconImage(new ImageIcon("iconos/navalgo.png").getImage());
		setTitle("Batalla Navalgo");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 990, 590);
		
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu mnJuego = new JMenu("Juego");
		menuBar.add(mnJuego);
		
		JMenuItem mntmNuevo = new JMenuItem("Nuevo...");
		mntmNuevo.addMouseListener(control.getListenerMenuNuevo(this, control));		
		mnJuego.add(mntmNuevo);
		
		JMenuItem mntmHistorialDeJugadores = new JMenuItem("Historial De Jugadores");
		mntmHistorialDeJugadores.addMouseListener(control.getListenerMenuHistorial());
		mnJuego.add(mntmHistorialDeJugadores);
		
		mnJuego.addSeparator();
		JMenuItem mntmSalir = new JMenuItem("Salir");
		mntmSalir.addMouseListener(control.getListenerMenuSalir(this));
		mnJuego.add(mntmSalir);
		
		JMenu mnAyuda = new JMenu("Ayuda");
		menuBar.add(mnAyuda);
		
		JMenuItem mntmContenido = new JMenuItem("Contenido");
		mntmContenido.addMouseListener(control.getListenerMenuAyuda());
		mnAyuda.add(mntmContenido);
		
		JMenuItem mntmAcercaDe = new JMenuItem("Acerca De...");
		mntmAcercaDe.addMouseListener(control.getListenerMenuAcercaDe());
		mnAyuda.add(mntmAcercaDe);
		
		// panel en el que estan el tablero y lo 
		// del jugador disparos y puntos
		JPanel panelBase = new JPanel();
		
		panelBase.setLayout(new GridLayout(1, 2, 1, 0));	
		setContentPane(panelBase);
		
		// panel del jugador
		JPanel jugadorPanel = new JPanel();
		
		jugadorPanel.setLayout(new GridLayout(3, 1, 1, 0));	
		
		// panel de puntos
		JPanel puntosPanel = this.crearPanelPuntos();
		
		jugadorPanel.add(puntosPanel);
		
		panelBase.add(jugadorPanel);
		
		// panel de disparos
		disparosPanel = this.crearPanelDisparos();
		jugadorPanel.add(disparosPanel);		
		
		// panel del tablero
		tableroPanel = this.crearPanelTablero();
		panelBase.add(tableroPanel);			
		
		JButton btnPasarTurno = new JButton("Listo");
		btnPasarTurno.addMouseListener(control.getListenerBotonPasarTurno());		
		puntosPanel.add(btnPasarTurno);	
		
		JPanel referenciaPanel = new JPanel();
		JLabel lblReferencia = new JLabel();
		lblReferencia.setIcon(new ImageIcon("iconos/ref.png"));
		referenciaPanel.add(new JLabel("Referencia"));
		referenciaPanel.add(lblReferencia);			
		jugadorPanel.add(referenciaPanel);
		referenciaPanel.setLayout(new BoxLayout(referenciaPanel, BoxLayout.LINE_AXIS));
		
		this.modelo.addObserver(this);
			
	}
	
		
	public void habilitarTablero(boolean estadoNuevo) {
		for (int i = 0; i < Tablero.tamanio; i++)
            for (int j = 0; j < Tablero.tamanio; j++)
            	tableroBotones[j][i].setEnabled(estadoNuevo);            
	}


	private JPanel crearPanelTablero() {
		tableroPanel = new JPanel();
		
		tableroPanel.setLayout(new GridLayout(Tablero.tamanio, Tablero.tamanio, 0, 0));			
		
		tableroBotones = new JButton[Tablero.tamanio][Tablero.tamanio];
		
		
		for (int i = 0; i < Tablero.tamanio; i++){
            for (int j = 0; j < Tablero.tamanio; j++) {
            	tableroBotones[j][i]=new JButton();   
            	String nombre = new Integer(i).toString();
            	nombre += new Integer(j).toString();
            	tableroBotones[j][i].setActionCommand(nombre);
            	tableroBotones[j][i].setBackground(Color.BLUE);
            	tableroBotones[j][i].setEnabled(false);
                tableroPanel.add(tableroBotones[j][i]);
                tableroBotones[j][i].addMouseListener(this.control.getListenerBotonTablero());
            }
        }
		return tableroPanel;
	}

	
	private JPanel crearPanelDisparos() {
		
		disparosPanel = new JPanel();		
	
		final JToggleButton tgbtnDisparoDirecto = new JToggleButton("Disparo Directo");			
		tgbtnDisparoDirecto.setIcon(new ImageIcon("iconos/dispdir.png"));
		tgbtnDisparoDirecto.setActionCommand(ModeloJuego.DisparoTipo.DISPARO_DIRECTO.toString());
		tgbtnDisparoDirecto.setSelected(true);
		this.control.setDisparoActual(tgbtnDisparoDirecto.getActionCommand());
		tgbtnDisparoDirecto.addMouseListener(this.control.getListenerBotonDisparoDirecto());
		disparosPanel.add(tgbtnDisparoDirecto);	
		
		JToggleButton tgbtnMinaContacto = new JToggleButton("Mina Contacto");
		tgbtnMinaContacto.setActionCommand(ModeloJuego.DisparoTipo.MINA_CONTACTO.toString());
		tgbtnMinaContacto.addMouseListener(this.control.getListenerBotonMinaContacto());
		disparosPanel.add(tgbtnMinaContacto);		
		tgbtnMinaContacto.setIcon(new ImageIcon("iconos/minacont.png"));
		
		JToggleButton tgbtnMinaPuntual = new JToggleButton("Mina Puntual");	
		tgbtnMinaPuntual.setActionCommand(ModeloJuego.DisparoTipo.MINA_PUNTUAL.toString());
		tgbtnMinaPuntual.addMouseListener(this.control.getListenerBotonMinaPuntual());	
		disparosPanel.add(tgbtnMinaPuntual);
		tgbtnMinaPuntual.setIcon(new ImageIcon("iconos/minapun.png"));
		
		JToggleButton tgbtnMinaDoble = new JToggleButton("Mina Doble");
		tgbtnMinaDoble.setActionCommand(ModeloJuego.DisparoTipo.MINA_DOBLE.toString());
		tgbtnMinaDoble.addMouseListener(this.control.getListenerBotonMinaDoble());		
		disparosPanel.add(tgbtnMinaDoble);
		tgbtnMinaDoble.setIcon(new ImageIcon("iconos/minadob.png"));		
		
		JToggleButton tgbtnMinaTriple = new JToggleButton("Mina Triple");
		tgbtnMinaTriple.setActionCommand(ModeloJuego.DisparoTipo.MINA_TRIPLE.toString());
		tgbtnMinaTriple.addMouseListener(this.control.getListenerBotonMinaTriple());
		disparosPanel.add(tgbtnMinaTriple);
		tgbtnMinaTriple.setIcon(new ImageIcon("iconos/minatri.png"));	
		
	
		ButtonGroup grupoBotonesOpcion = new ButtonGroup();
		grupoBotonesOpcion.add(tgbtnDisparoDirecto);
		grupoBotonesOpcion.add(tgbtnMinaContacto);
		grupoBotonesOpcion.add(tgbtnMinaTriple);
		grupoBotonesOpcion.add(tgbtnMinaDoble);
		grupoBotonesOpcion.add(tgbtnMinaPuntual);
	
		return disparosPanel;
	}

	
	private JPanel crearPanelPuntos() {
		JPanel puntosPanel = new JPanel();		
		puntosPanel.setLayout(new GridLayout(0, 2, 0, 0));
		
		Label puntosNombreLabel = new Label("Puntos");		
		puntosNombreLabel.setFont(new Font("Dialog", Font.BOLD, 14));
		puntosNombreLabel.setAlignment(Label.CENTER);
		puntosPanel.add(puntosNombreLabel);
		
		puntosLabel = new Label(String.valueOf(modelo.getPuntosTotalesJugador()));		
		puntosLabel.setFont(new Font("Dialog", Font.BOLD, 14));
		puntosLabel.setAlignment(Label.CENTER);		
		puntosPanel.add(puntosLabel);
		
		puntosBarra = new JProgressBar();
		puntosBarra.setForeground(Color.GREEN);
		puntosBarra.setOrientation(SwingConstants.VERTICAL);
		puntosBarra.setValue(100);
		puntosBarra.setName("Puntos");
		puntosPanel.add(puntosBarra);
		
		return puntosPanel;
	}


	public void update(Observable arg0, Object arg1) {
		for (int i = 0; i < Tablero.tamanio; i++)
            for (int j = 0; j < Tablero.tamanio; j++) {
            	tableroBotones[i][j].setIcon(null);
            	tableroBotones[i][j].setIcon(ManejadorDeIconos.ponerIcono(i, j));            	
            }
		
		puntosBarra.setValue((modelo.getPuntosJugador() * 100) / modelo.getPuntosTotalesJugador());
		puntosLabel.setText(String.valueOf(modelo.getPuntosJugador()));
		
		if (this.modelo.finDelJuego()) {
			HistorialJugadores.agregarInfoPartida(control.getNombreJugador(), this.modelo.getPuntosJugador());
			FinPartida mensajeFin = new FinPartida(this.modelo.getPuntosJugador());
			mensajeFin.setVisible(true);
			habilitarTablero(false);
			modelo.destruirJuego();
		}
		
	}	
	
}